#include "bsp/lcd.hpp"
#include "hal/delay.hpp"
#include "hal/gpio.hpp"
#include "hal/register.hpp"
#include "hal/spi.hpp"
#include "hal/timer.hpp"
#include "hal/i2c.hpp"
#include "bsp/touch.hpp"
#include "hal/adc.hpp"

// 定时器的中断服务函数 已配置为1秒的周期
extern "C" {
void TIMA0_IRQHandler(void)
{
    // // 如果产生了定时器中断
    // switch (DL_TimerG_getPendingInterrupt(TIMER_A0_INST)) {
    // case DL_TIMER_IIDX_ZERO: // 如果是0溢出中断
    //   hal::gpio<GPIOA_BASE, GPIO_OUTPUT_PIN_8_PIN>::toggle();
    //   DL_GPIO_togglePins(GPIOA, GPIO_OUTPUT_PIN_8_PIN);
    //   //GPIO_OUTPUT_PORT
    //   break;

    // default: // 其他的定时器中断
    //   break;
    // }
}

// SysTick中断处理函数（维护毫秒计时）
void SysTick_Handler(void)
{
    hal::delay::handler();
}

void DMA_IRQHandler(void)
{
}

void SPI0_IRQHandler(void)
{
    using lcd = bsp::lcd<hal::delay::ms, bsp::detail_lcd::DMAConfigType::enable>;
    switch (spi::get_pending_interrupt())
    {
    case DL_SPI_IIDX_DMA_DONE_TX:
        // 只有当设定好的数据全部发送出去，才会进入此中断
        lcd::dma_busy_ = false;
        break;
    case DL_SPI_IIDX_TX_EMPTY:
        // 只要进行一次SPI数据的发送，就会产生一次中断（频繁），一次DMA传输会触发多次数据的发送
        // lcd::dma_busy_ = false;
        break;
    default:
        break;
    }
}

void GROUP1_IRQHandler()
{
    switch (DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1))
    {
    case TOUCH_CTP_INT_IIDX:
        bsp::detail_touch::touch_int_flag = true;
        break;
    default:
        break;
    }
}

//ADC中断服务函数
    extern bool gCheckADC ;
void ADC0_IRQHandler(void)
{
    //查询并清除ADC中断
    switch (DL_ADC12_getPendingInterrupt(ADC_0_INST))
    {
    // //检查是否完成数据采集
    // case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
    //     gCheckADC = true;
    //     break;
    // case DL_ADC12_IIDX_MEM1_RESULT_LOADED:
    //     gCheckADC = true;
    //     break;
    // case DL_ADC12_IIDX_MEM2_RESULT_LOADED:
    //     gCheckADC = true;
    //     break;
    // case DL_ADC12_IIDX_MEM3_RESULT_LOADED:
    //     break;
    // case DL_ADC12_IIDX_MEM4_RESULT_LOADED:
    //     break;
    // case DL_ADC12_IIDX_MEM5_RESULT_LOADED:
    //     break;
    // case DL_ADC12_IIDX_MEM6_RESULT_LOADED:
    //     break;
    // case DL_ADC12_IIDX_MEM7_RESULT_LOADED:
    //     break;
    case DL_ADC12_IIDX_DMA_DONE:
        hal::adc0_0::adc_diable();
        //可以进行数据的分析和处理
        __BKPT(0);
        hal::adc0_0::adc_reset();
        break;
    default:
        break;
    }
}


//ADC中断服务函数
void ADC1_IRQHandler(void)
{
    //查询并清除ADC中断
    switch (DL_ADC12_getPendingInterrupt(hal::adc0_0::get_base()))
    {
    //检查是否完成数据采集
    case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
        break;
    case DL_ADC12_IIDX_MEM1_RESULT_LOADED:
        break;
    case DL_ADC12_IIDX_MEM2_RESULT_LOADED:
        break;
    case DL_ADC12_IIDX_MEM3_RESULT_LOADED:
        break;
    case DL_ADC12_IIDX_MEM4_RESULT_LOADED:
        break;
    case DL_ADC12_IIDX_MEM5_RESULT_LOADED:
        break;
    case DL_ADC12_IIDX_MEM6_RESULT_LOADED:
        break;
    case DL_ADC12_IIDX_MEM7_RESULT_LOADED:
        break;
    default:
        break;
    }
}
}
